import axios from 'axios'     //引入
import _ from 'lodash'
import { Message,Loading } from 'element-ui';
import { setCancelSource } from "@/common/js/cancelToken.js";
import router, { routes } from '@/router/index';
import store from '@/store';
// import { getToken } from '@/utils/token'//获取token的文件，登录后会返回token，然后用缓存存起来，再去读

let baseURL = 'http://8.130.105.125:10577'
// let baseURL = 'http://127.0.0.1:9098'

//这一步的目的是判断出当前是开发环境还是生成环境，方法不止一种，达到目的就行
// if(process.env.NODE_ENV=="production"){
//   baseURL='http://1.119.55.13:8104'
// }else{
//   baseURL='http://8.130.137.227:8104'
// }
let config = {
  baseURL: baseURL,
  timeout: 50000       //设置最大请求时间
}
const _axios = axios.create(config)

//loading对象
let loading;

//当前正在请求的数量
let needLoadingRequestCount = 0;

//显示loading
function showLoading(target) {
  // 后面这个判断很重要，因为关闭时加了抖动，此时loading对象可能还存在，
  // 但needLoadingRequestCount已经变成0.避免这种情况下会重新创建个loading
  if (needLoadingRequestCount === 0 && !loading) {
    loading = Loading.service({
      lock: true,
      text: "Loading...",
      background: 'rgba(255, 255, 255, 0.5)',
      // target: target || "body"   /////////
      target: "#pageContent"
    });
  }
  needLoadingRequestCount++;
}

//隐藏loading
function hideLoading() {
  needLoadingRequestCount--;
  needLoadingRequestCount = Math.max(needLoadingRequestCount, 0); //做个保护
  if (needLoadingRequestCount === 0) {
    //关闭loading
    toHideLoading();
  }
}

//防抖：将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时， loading闪烁的问题。
var toHideLoading = _.debounce(() => {
  loading && loading.close();
  loading = null;
}, 300);


/* 请求拦截器（请求之前的操作） */
_axios.interceptors.request.use(
  config => {
    console.log('请求之前的操作',config)
    //如果有需要在这里开启请求时的loading动画效果
    //判断当前请求是否设置了不显示Loading
    if (config.showLoading) {
      showLoading(config.headers.loadingTarget);
    }
    config.headers.Authorization =  localStorage.getItem('authToken') ? ("Bearer " + localStorage.getItem('authToken')) : "";  //添加token,需要结合自己的实际情况添加，
    return config;
  },
  err => {
    //判断当前请求是否设置了不显示Loading
    if (config.showLoading) {
      hideLoading();
    }
    Message.error('请求超时!');
    return Promise.resolve(err);
  })

/* 请求之后的操作 */
_axios.interceptors.response.use(
  res => {
    // console.log('请求之后',res)
    //在这里关闭请求时的loading动画效果
    //这里用于处理返回的结果，比如如果是返回401无权限，可能会是跳回到登录页的操作，结合自己的业务逻辑写
    if (res.data.code === 401) {
      Message.error("登录信息已过期或无权限")
      /*store.commit("logout", "false");
      localStorage.setItem('authToken', '')
      localStorage.setItem('userInfo', '')
      router.push({path: '/login'})*/
    }
    if (res.data.code === 400) {
      Message.error("请求网络失败")
    }
    if (res.data.code === 404) {
      Message.error("请求网络失败")
    }
    if (res.data.code === 9999) {
      Message.error(res.data.data)
    }
    if (res.data.code === 500) {
      if(res.data.message == '尚未登录或登录信息已过期'){
        store.commit("logout", "false");
        localStorage.setItem('authToken', '')
        localStorage.setItem('userInfo', '')
        router.push({path: '/login'})
      }else {
        Message.error(res.data.message)
      }
    }
    //判断当前请求是否设置了不显示Loading
    if (res.config.showLoading) {
      hideLoading();
    }
    return res;
  },
  err => {
    if (err) {
      console.log(err)
      //在这里关闭请求时的loading动画效果
      //判断当前请求是否设置了不显示Loading
      if (err.config.showLoading) {
        hideLoading();
      }
      if (err.response && err.response.data && err.response.data.message) {
        var jsonObj = JSON.parse(err.response.data.message);
        Message.error(jsonObj.message || "请求网络失败")
      } else {
        Message.error(err.message || "请求网络失败")
      }

    }
    return Promise.reject(err);
  }
);

//封装post,get方法,其他的自行往下加，比如put,delete
const http = {
  get(data) {
    return new Promise((resolve, reject) => {
      _axios({
        url: data.url,
        params: data.params || {},
        headers: data.headers || {},
        method: 'GET',
        cancelToken: setCancelSource(),
        showLoading: data.loading == undefined ? true : data.loading,
        ...data.other
      }).then(res => {
        resolve(res.data)
        return res
      }).catch(error => {
        reject(error)
      })
    })
  },
  post(data) {
    return new Promise((resolve, reject) => {
      _axios({
        url: data.url,
        data: data.params || {},
        headers: data.headers || {},
        method: 'POST',
        cancelToken: setCancelSource(),
        showLoading: data.loading == undefined ? true : data.loading,
        ...data.other
      }).then(res => {
        resolve(res.data)
        return res
      }).catch(error => {
        reject(error)
      })
    })
  },
  baseURL
}


export default http
